#!/bin/bash
#
# 1. 目标：用于过滤日志文件中包含[Ee]rr错误关键字的行的内容
# 2. 参数：日志文件名
# 3. 可修改变量：默认一次过滤100行【可通过read_line变量调节】
# 4. 设计实现：
#	1）通过记录日志文件inode和日志文件的前50字节md5来确定是对同一个日志文件进行操作
# 	2）通过记录行号来对日志进行循环操作

if [ $# -ne 1 ];then
        echo "Usage: $0 path_to_file"
        exit
fi

sub_name=$(basename $1|sed -ne 's/\./_/gp')
[ ! -e /tmp/run_${sub_name}.lock ] && echo "0 0 0" > /tmp/run_${sub_name}.lock

start_line=`awk '{print $3}' /tmp/run_${sub_name}.lock`
read_line=100
file_maxline=$(wc -l $1 |awk '{print $1}')
end_line=$(($start_line+$read_line))

export_line_num () {
        awk 'BEGIN{var='$end_line'}NR>'$start_line'&&NR<='$end_line'{
        while($0 ~ /[Ee]rr/){var=NR;print $0;exit}}\
        END{print '$current_inode',"'$current_md5'",var > "'/tmp/run_${sub_name}.lock'"}' $1
}

current_inode=$(ls -i $1 |awk '{print $1}')
lock_inode=$(awk '{print $1}' /tmp/run_${sub_name}.lock)

dd if="$1" of=/tmp/run_${sub_name}.md5 bs=50 count=1 >/dev/null 2>&1
current_md5=$(md5sum /tmp/run_${sub_name}.md5 |cut -c -10)
lock_md5=$(awk '{print $2}' /tmp/run_${sub_name}.lock)
rm -f /tmp/run_${sub_name}.md5

# 假如文件inode号不同，则重新设置inode号、前50字节MD5、开始行号为0
if [ "$current_inode" != "$lock_inode" ];then
        echo "$current_inode $current_md5 0" > /tmp/run_${sub_name}.lock
fi
# 假如文件前50字节MD5不同，则重新设置inode号，前50字节MD5，开始行号
if [ "$current_md5" != "$lock_md5" ];then
        echo "$current_inode $current_md5 0" > /tmp/run_${sub_name}.lock
fi

# 如果当前日志文件总行数大于本次读取的日志的截止行，则输出截止行
if [ $file_maxline -ge $end_line ];then
     export_line_num $1
else
# 否则，输出文件总行数
     end_line=$file_maxline
     export_line_num $1
fi
